#include <iostream>
#include <unistd.h>
#include <cassert>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
#include <cstring>
using namespace std;
//父进程读取，子进程写入
int main()
{
    //第一步父进程创建管道
    int fds[2];
    int n=pipe(fds);
    assert(n==0);
    //第二步父进程fork()创建子进程
    pid_t id =fork();//fork之后，父进程返回值>0,子进程返回值==0
    assert(id>=0);
    const char* s="我是子进程,我的pid是：";
    int cnt=0;
    if(id==0)
    {
        close(fds[0]);//子进程关闭读取的fd
        //子进程的通信代码
        while(true)
        {
            char buffer[1000];//这个缓冲区只有子进程能看到
            snprintf(buffer,sizeof(buffer),"子进程第%d次向父进程发送：%s%d",++cnt,s,getpid());//向缓冲区buffer中打印
            write(fds[1],buffer,strlen(buffer));//子进程将缓冲区数据写入管道
            //sleep(1);//每隔1秒写一次
            //break;
        }
        close(fds[1]);//如果break跳出循环，子进程将关闭写端
        exit(0);
    }
    close(fds[1]);//父进程关闭写入 
    //父进程的通信代码
    while(true)
    {
        char buffer[1000];//这个缓冲区只有父进程能看到
        //如果管道中没有数据，读取端再读，默认会阻塞当前读取的进程
        ssize_t s=read(fds[0],buffer,sizeof(buffer)-1);
        if(s>0)//s是read读取成功字节数
        {
            buffer[s]='\0';
            cout << "父进程的pid是："<<getpid()<<" "<<buffer<<endl;
        }  
        else if(s==0)//如果子进程关闭写端，父进程将会输出“读完了”
        {
            //读到文件结尾
            cout<<"读完了"<<endl;
            break;
        }
        break;    
    }
    close(fds[0]);//父进程关闭读端，子进程马上被信号终止
    cout<<"父进程关闭读端"<<endl;
    int status=0;
    n=waitpid(id,&status,0);
    assert(n==id);
    cout<<n<<":"<<(status&0X7F)<<endl;
    return 0;
}